solidity语法:
写Solidity最大的不同在于,我们要随时计算好我们的gas消耗,方法的复杂度,变量类型的存储位置(memory,storage等等)都会决定gas的消耗量。
以上编写合约在vim,编译在Remix,运行端在geth console。过程十分繁复,不适合大规模工程开发,需要通过Truffle来整合以上操作;
一、环境配置:
truffle依赖于nodejs,可能存在版本之间的兼容性问题,首先删除自带的nodejs和npm,再进行全安装;
1 | sudo apt-get remove nodejs |
二、
1 | 1. block.blockhash(uint blockNumber) returns (bytes32): 返回参数区块编号的hash值。(范围仅限于最近256块,还不包含当然块) |
三、发币
使用truffle init 来初始化项目;但truffle推出Boxes功能之后,我们可以直接套用react-box的样板,节省时间;
1 | root@keke:~/truffle-project/coin# truffle unbox react-box |
编译自带的智能合约:
1 | root@keke:~/truffle-project/coin# truffle compile |
3、安装OpenZeppelin来简化加密钱包开发过程;
OpenZeppelin
是一套能够给我们方便提供编写加密合约的函数库,同时里面也提供了兼容ERC20
的智能合约。
1 | npm install zeppelin-solidity |
4、创建代币合约
1 | pragma solidity ^0.4.0; |
5、编译、部署和验证
在migrations/
目录下建立一个3_deploy_contracts.js
文件,内容如下:
1 | var NenmoCoin = artifacts.require("./NenmoCoin.sol"); |
部署:
1 | truffle develop //进入开发环境 |
测试:
1 | truffle(develop)> var c |
部署到geth私链:
attach 进入console:
1 | geth attach ipc:/root/goproject/private-chain/geth.ipc |
查看帐户:
1 | >personal |
查看truffle.js:
1 | module.exports = { |
truffle migrate //部署到geth
【truffle migrate】问题汇总:
- Error: exceeds block gas limit undefined
当前合约所需的gas超过了区块的最大gas。这可能是由于创世区块的配置文件genesis.json
中的参数gasLimit
设置过小有关,
解决方案:
重置truffle.js中gas参数的大小;
1 | //再次进入ipc |
在geth中查找已部署的合约
从truffle 项目目录下,build/contracts/NewCoin.json获取abi;并由http://www.bejson.com 转成字符串;
1 | var abi = JSON.parse($abi) |
调用合约中的方法:
- call() 直接返回结果,不会写入区块链
- sendTransaction() 发送一笔交易,会写入区块链中,返回值是交易的哈希值。
ERC20 Token
ERC20是以太坊定义的一个代币标准。是一种发行代币合约必须要遵守的协议,该协议规定了几个参数:
- 发行货币的名称
- 简称
- 发行量
- 支持的函数
只有支持了该协议才会被以太坊所认同;
erc20 标准
1 | // https://github.com/ethereum/EIPs/issues/20 |
solidity:
- address
- 属性:balances
- 函数: send(), call(), delegatecall(), callcode()
solidity 语法1
https://www.jianshu.com/p/e8113bfa7694
对tx.data进行Keccak256()编码;
以太坊交易的类型:
- 转账的交易
- 创建合约的交易
- 执行合约的交易
参数是一个对象,在发送交易的时候指定不同的字段,区块链及链根据参数识别出对应类型的交易;
转账交易:
转账是最简单的一种交易,从一个帐户向另一个帐户发送以太币1
2
3
4
5web3.eth.sendTransaction({
from: "0x....",
to: "0x....",
value: 100000
})
创建合约的交易:
将合约部署到区块链节点上,通过发送交易来实现。
1 | web3.eth.sendTransaction({ |
to字段留空不填
执行合约的交易:调用合约中的方法,需要将交易的to字段指定为调用的合约的地址, 通过data字段指定要调用的方法以及向该方法传递的参数1
2
3
4
5web3.eth.sendTransaction({
from: "sender's address",
to: " contract address",
data: "目标方法和传递的参数"
})
data字段需要特殊的编码规则,一般使用SDK(web3.js)
web3.eth
包含以太坊区块链相关的方法
- web3.eth.gasprice //gas当前单价
- web3.eth.accounts //当前节点的帐户列表
- web3.eth.getBalance()
- web3.eth.getTransaction()
创建帐户
gas limit: 这个交易的执行最都被允许使用的计算步骤
gas price: 交易发送者愿意支付的gas费用,一个单位的gas表示了执行一个基本指令;